package br.com.foxinline.servico.historico;

import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.generico.ServicoHistoricoGenerico;
import br.com.foxinline.modelo.Proprietario;
import br.com.foxinline.modelo.Usuario;
import br.com.foxinline.servico.EnderecoServico;
import br.com.foxinline.servico.ProprietarioServico;
import br.com.foxinline.servico.UsuarioServico;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author laverson
 */
@Stateless
public class ProprietarioHistoricoServico extends ServicoHistoricoGenerico<Proprietario> {

    @EJB
    UsuarioServico usuarioServico;
    @EJB
    ProprietarioServico proprietarioServico;
    @EJB
    EnderecoServico enderecoServico;

    public ProprietarioHistoricoServico() {
        super(Proprietario.class);
    }

    /**
     * Retorna todos os registros que possuem alguma diferenca entre o objeto
     * atual do banco.
     *
     * @param id do proprietario
     * @return lista de proprietarios com as diferencas encontradas em cada um
     */
    public List<Proprietario> history(Long id) {

        // Obtem todos os registros do historico
        List<Object[]> history = findQueryHistory(id);

        Proprietario atual = this.proprietarioServico.find(id);

        List<Proprietario> historicos = new ArrayList<Proprietario>();
        Proprietario historico;

        for (Object[] object : history) {

            historico = novaEntidade(object);
            comparar(historico, atual, false);

            if (!historico.equals(atual) && isAdd()) {

                if (historico.getUsuarioAtualizacao() != null && historico.getUsuarioAtualizacao().getId() != null) {
                    historico.setUsuarioAtualizacao(this.usuarioServico.find(historico.getUsuarioAtualizacao().getId()));
                } else {
                    historico.setUsuarioAtualizacao(this.usuarioServico.find(atual.getUsuarioAtualizacao().getId()));
                }

                historico.setDataAtualizacao((Date) object[19]);
                historicos.add(historico);

                setAdd(false);
            }

            atual = historico;
        }

        return historicos;
    }

    /**
     * Atribui os valores contidos em object[] para os atributos equivalentes a
     * entidade Bairro
     *
     * <br/> <p> <b>Author:</b> Diego Laverson</P>
     *
     * @param object
     * @return
     */
    private Proprietario novaEntidade(Object[] object) {
        Proprietario historico = new Proprietario();

        historico.setId((Long) object[0]);

        for (TipoDocumento tipoDocumento : TipoDocumento.values()) {
            if (tipoDocumento.name().equals(object[10])) {
                historico.setTipoDocumento(tipoDocumento);
            }
        }

        if (historico.getTipoDocumento().equals(TipoDocumento.CPF)) {

            historico.setCpf((String) object[2]);
            historico.setDataNasc((Date) object[3]);
            historico.setLocalTrabalho((String) object[4]);
            historico.setNome((String) object[5]);
            historico.setOrgaoEmissor((String) object[7]);
            historico.setProfissao((String) object[8]);
            historico.setRg((String) object[9]);

        } else {
            historico.setCnpj((String) object[1]);
            historico.setNomeFantasia((String) object[6]);
        }

        historico.setVersao((Integer) object[11]);

        if (object[12] != null) {

            Date dataInicial = (Date) object[18];
            Date dataFinal = (Date) object[19];

            historico.setEndereco(getEnderecoHistoricoPorDataProprietario((Long) object[12], dataFinal, dataInicial));
        }

        historico.setUsuarioAtualizacao(new Usuario());
        historico.getUsuarioAtualizacao().setId((Long) object[16]);

        return historico;
    }
}
